package com.hulytu.android.push;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import org.jetbrains.annotations.NotNull;

import java.util.Map;
import java.util.Objects;

/**
 * 统一推送处理
 * <p>
 * 接入代码
 *
 * <ol>
 *     <li> 平台初始化，如 极光平台
 *         <pre class="prettyprint">
 * AppPush push = new com.hulytu.android.push.jpush.JPush();
 * // 一般初始化
 * push.init(context);
 * // 如果有自定义参数，可使用 map 传参
 * Map&lt;String, Object&gt; params = new ArrayMap&lt;&gt;();
 * push.init(context, params);
 *         </pre>
 *     </li>
 *     <li> 注册广播
 *     <ol>
 *         <li>Java代码
 *         <pre class="prettyprint">
 * public class PushReceiver extends BroadcastReceiver {
 *
 *      <code>@Override</code>
 *      public void onReceive(Context context, Intent intent) {
 *          // TODO 处理自己的逻辑
 *      }
 * }
 *         </pre>
 *
 *         </li>
 *         <li>AndroidManifest.xml
 *         <pre>
 * &lt;receiver
 *      android:name=&quot;.PushMessageReceiver&quot;
 *      android:exported=&quot;false&quot;&gt;
 *      &lt;intent-filter&gt;
 *              &lt;!-- Do not modify this --&gt;
 *              &lt;action android:name=&quot;com.hulytu.push.action.PUSH_RECEIVER&quot; /&gt;
 *              &lt;/intent-filter&gt;
 * &lt;/receiver&gt;
 *         </pre>
 *         </li>
 *
 *         <li>
 *              <pre>
 *      <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
 *
 *         <meta-data android:name="JPUSH_APPKEY" android:value="您应用的 Appkey"/>
 *          </pre>
 *         </li>
 *     </ol>
 *
 *     </li>
 *
 *
 * </ol>
 *
 * @author Chris Chan (Q:hulytu@163.com)
 * @date 2021/8/13 23:30
 **/
public abstract class AppPush {

    public static final String RECEIVER_ACTION = "com.hulytu.android.intent.PUSH_RECEIVE";

    /**
     * 保存推送ID/Token之类的设备标识
     */
    protected static final String KEY_PUSH_DEVICE_TOKEN = "thin_droid_push_device_token";

    private Context mContext;

    /**
     * 初始化推送
     *
     * @param context 应用上下文
     */
    public void init(@NotNull Context context) {
        init(context, null);
    }

    /**
     * 带参数的初始化
     *
     * @param context 应用上下文
     * @param params  每个平台的差异化参数
     */
    public void init(@NotNull Context context, Map<String, ?> params) {
        this.mContext = context.getApplicationContext();
        AppPushManager.getInstance().addPush(platform(), this);
    }

    /**
     * @return 平台名称
     */
    public abstract String platform();

    protected void setPushDeviceToken(String token) {
        getSharedPreferences().edit()
                .putString(deviceTokenKey(), token)
                .apply();
    }

    public String getPushDeviceToken() {
        return getSharedPreferences()
                .getString(deviceTokenKey(), "");
    }

    protected String deviceTokenKey() {
        return platform() + "-" + KEY_PUSH_DEVICE_TOKEN;
    }

    protected Context getContext() {
        return mContext;
    }

    protected SharedPreferences getSharedPreferences() {
        return PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(mContext, "Please call after initialization."));
    }
}